// TODO 更换为自己的接口和防抖工具函数
import {getCartList} from "@/api/cart";
import tool from "@/utils/function";

import Vue from 'vue'

const CartStore = Vue.observable({
    // TODO 数据结构 更换为自己的购物车接口的数据结构
    /**
     *  [
     *     {
     *         id: '', // 购物车id
     *         goods: {}, // 商品信息
     *         spec_info: {}, // 规格信息
     *         goods_id: '', // 购物车商品id
     *         spec_id: '', // 购物车规格id
     *         goods_num: 1, // 数量
     *         selected: 1, // 选中状态
     *     }
     *  ]
     * 
     */
    items: [],
})

const CartMutations = {
    // TODO 加载购物车数据
    loadCart: tool.debounce(() => {
        console.log('加载购物车数据')
        getCartList().then(res => {
            if(res.code) {
                // TODO 
                CartStore.items = res.data.lists
            }
        })
    }, 500),

    // 添加/更新商品 TODO 可直接使用接口数据，可自行修改为本地添加
    addItem(goods,specItem,num = 1) {
        CartMutations.loadCart()
    },

    // 通过购物车项ID移除商品
    removeItem(cartId) {
        const index = CartStore.items.findIndex(i => i.id === cartId)
        if (index > -1) {
            CartStore.items.splice(index, 1)
        }
    },

    // 更新购物车项数量
    updateQuantity(cartId, num) {
        const item = CartStore.items.find(i => i.id === cartId)
        if (item) {
            item.goods_num = Math.max(0, num)
        }
    },

    // 根据商品信息和规格信息更新具体购物车项数量
    updateSpecQuantity(goodsId, specId, num = 1) {
        const item = CartStore.items.find(i =>
            i.goods_id === goodsId &&
            i.spec_id === specId
        )
        if (item) {
            item.goods_num = Math.max(0, num)
        } else {
            CartMutations.loadCart()
        }
    },

    // 切换选中状态
    toggleChecked(cartId,status=true) {
        const item = CartStore.items.find(i => i.id === cartId)
        if (item) {
            item.selected = status ? 1 : 0
        }
        CartMutations.loadCart()
    },

    // 全选
    toggleAllChecked(status = true) {
        CartStore.items.forEach(item => {
            item.selected = status ? 1 : 0
        })
        CartMutations.loadCart()
    },

    // 清空购物车
    clearCart() {
        CartStore.items = []
    }
}

const CartGetters = {
    // 获取指定购物车项的数量
    getItemQuantity(cartId) {
        const item = CartStore.items.find(i => i.id === cartId)
        return item ? item.goods_num : 0
    },

    // 获取指定商品规格的数量（通过goods_id + spec_id）
    getSpecQuantity(goodsId, specId) {
        const item = CartStore.items.find(i =>
            i.goods_id === goodsId &&
            i.spec_id） === specId
        )
        return item ? item.goods_num : 0
    },

    // 获取商品总数量（同一商品不同规格累加）
    getGoodsTotalQuantity(goodsId) {
        return CartStore.items
            .filter(i => i.goods_id === goodsId)
            .reduce((sum, item) => sum + item.goods_num, 0)
    },

    // 获取完整购物车列表
    getCartList() {
        return [...CartStore.items]
    },

    // 获取选中状态
    getCheckedStatus(cartId) {
        const item = CartStore.items.find(i => i.id === cartId)
        return item ? item.selected === 1 : false
    },

    // 获取已选中的数量
    getCheckedCount() {
        return CartStore.items.filter(item => item.selected === 1).length
    },

    // 获取选中状态的价格
    getCheckedPrice() {
        return CartStore.items
            .filter(item => item.selected * 1 === 1)
            .reduce((sum, item) => sum + item.goods_num * (item.spec_info.price * 1), 0)
    },
}

const CartPlugin = {
    install(Vue) {
        Vue.prototype.$cart = {
            // 加载数据
            loadCart: CartMutations.loadCart,

            // 添加商品
            addToCart(goods,specItem, num = 1) {
                CartMutations.addItem(goods,specItem, num)
            },

            // 通过购物车项ID移除
            removeFromCart(cartId) {
                CartMutations.removeItem(cartId)
            },

            // 修改数量
            updateQuantity(cartId, num) {
                CartMutations.updateQuantity(cartId, num)
            },

            // 根据商品信息和规格信息更新具体购物车项数量
            updateSpecQuantity(goodsId, specId, num = 1) {
                CartMutations.updateSpecQuantity(goodsId, specId, num)
            },

            // 切换选中状态
            toggleChecked(cartId) {
                CartMutations.toggleChecked(cartId)
            },

            // 全选
            toggleAllChecked(status = true) {
                CartMutations.toggleAllChecked(status)
            },

            // 获取方法
            getItemQuantity: CartGetters.getItemQuantity,
            getSpecQuantity: CartGetters.getSpecQuantity,
            getGoodsTotalQuantity: CartGetters.getGoodsTotalQuantity,
            getCartList: CartGetters.getCartList,
            getCheckedStatus: CartGetters.getCheckedStatus,
            getCheckedCount: CartGetters.getCheckedCount,
            getCheckedPrice: CartGetters.getCheckedPrice,

            // 清空购物车
            clearCart() {
                CartMutations.clearCart()
            }
        }
    }
}

export default CartPlugin